package luke.media.image;

import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;

/**
 * 图片爬取和管理类，用于从网站获取图片并进行本地存储和随机选择。
 */
public class ImageCrawler {
    private String saveDirectory;
    private int width;
    private int height;
    private static final int DEFAULT_WIDTH = 1280;
    private static final int DEFAULT_HEIGHT = 720;
    private static final String PICSUM_API_BASE_URL = "https://picsum.photos/";

    /**
     * 无参构造函数，使用默认的保存目录和图片尺寸。
     */
    public ImageCrawler() {
        // 使用用户目录下的pictures目录作为默认路径
        this(System.getProperty("user.home") + File.separator + "Pictures" + File.separator + "RunBeats", DEFAULT_WIDTH, DEFAULT_HEIGHT);
    }

    /**
     * 有参构造函数，允许自定义保存目录和图片尺寸。
     * @param saveDirectory 图片保存的目录。
     * @param width 图片的宽度。
     * @param height 图片的高度。
     */
    public ImageCrawler(String saveDirectory, int width, int height) {
        this.saveDirectory = saveDirectory;
        this.width = width;
        this.height = height;
        // 确保保存目录存在
        File dir = new File(this.saveDirectory);
        if (!dir.exists()) {
            dir.mkdirs();
        }
    }

    /**
     * 构造函数，只指定保存目录，使用默认的宽度和高度。
     * @param saveDirectory 图片保存的目录。
     */
    public ImageCrawler(String saveDirectory) {
        this(saveDirectory, DEFAULT_WIDTH, DEFAULT_HEIGHT);
    }

    /**
     * 从网站爬取指定数量的图片并保存到本地。
     * 每次运行爬取5张 16:9 比例的图片。
     * 注意：Unsplash API 可能会有速率限制，频繁调用可能导致请求失败。
     * @param numberOfImages 要爬取的图片数量。
     */
    public void crawlAndSaveImages(int numberOfImages) {
        new Thread(() -> {
            doCrawlAndSaveImages(numberOfImages);
        }).start();
    }

    private void doCrawlAndSaveImages(int numberOfImages) {
        System.out.println("开始爬取图片...");
        for (int i = 0; i < numberOfImages; i++) {
            try {
                // 构建 Picsum 随机图片 URL，指定尺寸
                // Picsum 默认就是随机的，不需要额外的随机参数
                String imageUrl = PICSUM_API_BASE_URL + width + "/" + height + "?random=" + System.currentTimeMillis();
                URL url = new URL(imageUrl);
                BufferedImage image = null;
                int retries = 3;
                for (int j = 0; j < retries; j++) {
                    try {
                        image = ImageIO.read(url);
                        if (image != null) {
                            break; // 成功读取，跳出重试循环
                        }
                    } catch (IOException e) {
                        System.err.println("尝试读取图片失败 (重试 " + (j + 1) + "/" + retries + "): " + imageUrl + ", 错误: " + e.getMessage());
                        if (j < retries - 1) {
                            Thread.sleep(2000); // 等待2秒后重试
                        }
                    }
                }

                if (image != null) {
                    String fileName = "crawled_image_" + System.currentTimeMillis() + ".jpg";
                    File outputFile = new File(saveDirectory, fileName);
                    ImageIO.write(image, "jpg", outputFile);
                    System.out.println("成功保存图片: " + outputFile.getAbsolutePath());
                } else {
                    System.err.println("无法从URL读取图片: " + imageUrl);
                }
            } catch (IOException e) {
                System.err.println("爬取或保存图片时发生IO错误: " + e.getMessage());
                e.printStackTrace();
            } catch (InterruptedException e) {
                Thread.currentThread().interrupt(); // 恢复中断状态
                System.err.println("图片爬取中断: " + e.getMessage());
            } catch (Exception e) {
                System.err.println("爬取或保存图片时发生未知错误: " + e.getMessage());
                e.printStackTrace();
            }
            try {
                Thread.sleep(1000); // 每次爬取之间增加1秒延迟，避免频繁请求
            } catch (InterruptedException e) {
                Thread.currentThread().interrupt();
                System.err.println("延迟中断: " + e.getMessage());
            }
        }
        System.out.println("图片爬取完成。");
    }

    /**
     * 从保存目录中随机选择一张图片路径。
     * @return 随机选择的图片文件的绝对路径，如果目录中没有图片则返回null。
     */
    public String getRandomImagePath() {
        File imageDir = new File(saveDirectory);
        File[] files = imageDir.listFiles((d, name) -> name.toLowerCase().endsWith(".jpg") || name.toLowerCase().endsWith(".png") || name.toLowerCase().endsWith(".jpeg"));

        if (files == null || files.length == 0) {
            System.out.println("图片目录中没有找到图片: " + saveDirectory);
            return null;
        }

        Random random = new Random();
        File randomFile = files[random.nextInt(files.length)];
        return randomFile.getAbsolutePath();
    }

    /**
     * 从保存目录中随机选择指定数量的图片路径。
     * @param numberOfImages 要获取的图片数量。
     * @return 随机选择的图片文件的绝对路径列表，如果目录中没有图片则返回空列表。
     */
    public List<String> getRandomImagePaths(int numberOfImages) {
        File imageDir = new File(saveDirectory);
        File[] files = imageDir.listFiles((d, name) -> name.toLowerCase().endsWith(".jpg") || name.toLowerCase().endsWith(".png") || name.toLowerCase().endsWith(".jpeg"));

        if (files == null || files.length == 0) {
            System.out.println("图片目录中没有找到图片: " + saveDirectory);
            return new ArrayList<>();
        }

        List<String> selectedImagePaths = new ArrayList<>();
        Random random = new Random();

        // 如果请求的数量大于可用图片数量，则返回所有可用图片
        int count = Math.min(numberOfImages, files.length);

        // 随机选择图片，确保不重复
        List<File> fileList = new ArrayList<>(java.util.Arrays.asList(files));
        for (int i = 0; i < count; i++) {
            int randomIndex = random.nextInt(fileList.size());
            selectedImagePaths.add(fileList.remove(randomIndex).getAbsolutePath());
        }
        return selectedImagePaths;
    }

    // 示例用法
    public static void main(String[] args) {
        // 使用默认设置
        ImageCrawler defaultCrawler = new ImageCrawler();
        defaultCrawler.crawlAndSaveImages(5); // 爬取5张图片
        String randomDefaultImage = defaultCrawler.getRandomImagePath();
        if (randomDefaultImage != null) {
            System.out.println("随机获取的默认图片路径: " + randomDefaultImage);
        }

        // 使用用户目录下的Pictures目录作为默认路径
        String customDir = System.getProperty("user.home") + File.separator + "Pictures" + File.separator + "RunBeats";
        int customWidth = 1920;
        int customHeight = 1080;
        ImageCrawler customCrawler = new ImageCrawler(customDir, customWidth, customHeight);
        customCrawler.crawlAndSaveImages(3); // 爬取3张图片
        String randomCustomImage = customCrawler.getRandomImagePath();
        if (randomCustomImage != null) {
            System.out.println("随机获取的自定义图片路径: " + randomCustomImage);
        }

        // 测试获取多张图片
         List<String> multipleImages = customCrawler.getRandomImagePaths(2);
         System.out.println("随机获取的2张图片路径: " + multipleImages);
     }
 }